package code;

import java.util.ArrayList;

public class User {

	public String name, login, adress;
	public ArrayList<Item> items;
	public ArrayList<User> friends;

	/**
	 * Constroi um objeto do tipo User.
	 * 
	 * @param name
	 *            Nome do usuario
	 * @param login
	 *            Login do usuario
	 * @param adress
	 *            Endereco do usuario
	 * @throws Exception
	 *             Lanca excecao no caso de nome, login ou endereco invalido
	 */
	public User(String name, String login, String adress) throws Exception {

		items = new ArrayList();
		friends = new ArrayList();

		if (name == null || name.isEmpty()) {
			throw new Exception("Nome invalido!");
		} else {
			this.name = name;
		}

		if (login == null || login.isEmpty()) {
			throw new Exception("Login invalido!");
		} else {
			this.login = login;
		}

		if (adress == null || adress.isEmpty()) {
			throw new Exception("Endereco invalido!");
		} else {
			this.adress = adress;
		}

	}

	/**
	 * Metodo que retorna o nome do usuario corrente
	 * 
	 * @return
	 */
	public String getName() {
		return name;
	}

	/**
	 * 
	 * @param newName
	 *            Novo nome para o usuario corrente
	 */
	public void setName(String newName) throws Exception {
		if (newName.isEmpty() || newName == null) {
			throw new Exception("Novo nome invalido!");
		} else {
			name = newName;
		}

	}

	/**
	 * Metodo que retorna o login do usuario corrente
	 * 
	 * @return
	 */
	public String getLogin() {
		return login;
	}

	/**
	 * 
	 * @param newLogin
	 *            New login for user
	 */
	public void setLogin(String newLogin) throws Exception {
		if (newLogin.isEmpty() || newLogin == null) {
			throw new Exception("Novo login invalido");
		} else {
			login = newLogin;
		}

	}

	/**
	 * Metodo que retorna o endereco do usuario corrente
	 * 
	 * @return
	 */
	public String getAdress() {
		return adress;
	}

	/**
	 * Metodo que muda o endereco do usuario corrente
	 * 
	 * @param newAdress
	 *            Novo endereco do usuario
	 * @throws Exception
	 *             Lanca excecao no caso de endereco invalido
	 */
	public void setAdress(String newAdress) throws Exception {
		if (newAdress.isEmpty() || newAdress == null) {
			throw new Exception("Novo endereco invalido");
		} else {
			adress = newAdress;
		}
	}

	/**
	 * Metodo que adiciona usuario passado como parametro a lista de amigos do
	 * usuario
	 * 
	 * @param friend
	 *            Amigo a ser adicionado
	 * @throws Exception
	 *             Lanca excecao no caso de usuario invalido
	 */
	public void addFriend(User friend) throws Exception {
		if (friend == null) {
			throw new Exception("Usuario para adicao invalido");
		}
		for (User friendCompare : friends) {
			if (friendCompare.getLogin() == friend.getLogin()) {
				throw new Exception("Ja adicionado aos amigos");
			}
		}
		friends.add(friend);
	}

	/**
	 * Metodo que remove usuario da lista de amigos do usuario corrente
	 * 
	 * @param friend
	 *            Amigo a ser removido
	 * @throws Exception
	 *             Lanca excecao no caso do usuario passado como parametro ser
	 *             invalido
	 */
	public void removeFriend(User friend) throws Exception {
		if (friend == null) {
			throw new Exception("Usuario para remocao invalido");
		}
		for (User friendCompare : friends) {
			if (friendCompare.getLogin() == friend.getLogin()) {
				friends.remove(friendCompare);
				break;
			}
		}
	}
	
	public void addItem(Item item) throws Exception {
		if(item == null) {
			throw new Exception("Item para adicao invalido");
		}
		items.add(item);
	}

}
